package org.muyu;

import org.muyu.component.LargeCustomerStrategy;
import org.muyu.component.Price;
import org.muyu.component.Strategy;

/**
 * 行为型模式 => 策略模式
 *
 * 组成部件
 * 1. 策略接口【Strategy】
 * 2. 策略实现【ConcreteStrategy】 => LargeCustomerStrategy、NormalCustomerStrategy、OldCustomerStrategy对应了三种客户的报价策略
 * 3. 上下文【Context】 => 这里的上下问就是 Price，其持有 Strategy 策略接口，实例化时会调用具体子类的方法
 *
 * 将一系列算法封装起来，并使它们之间相互替换。简单来说就是我们需要某个类的某个方法，在不同场景下具有不同的行为
 *
 * 案例理解
 * 本案例共有三种报价策略 LargeCustomerStrategy、NormalCustomerStrategy、OldCustomerStrategy
 * Price就是上下文的组件，在构建时需要持有具体的策略实现，并通过具体的实现完成最终的报价功能
 * 灵魂就是这个上下文组件，通过多态提高了代码的复用性
 */
public class Client {
    public static void main(String[] args) {
        //1：选择并创建需要使用的策略对象
        Strategy strategy = new LargeCustomerStrategy();
        //2：创建上下文
        Price ctx = new Price(strategy);

        //3：计算报价
        double quote = ctx.quote(1000);
        System.out.println("向客户报价："+quote);
    }
}
